package com.baitiaojun.common.utils.object;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ObjectUtil;
import com.baitiaojun.common.domain.model.result.PageResult;
import com.baitiaojun.common.utils.collection.CollectionUtils;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * bean转换工具
 */
public class BeanUtils {

    /**
     * 对分页object进行类型转换
     * @param pageResult
     * @param clazz
     * @return
     * @param <T>
     */
    public static <T, R> PageResult<R> toBean(PageResult<T> pageResult, Class<R> clazz) {
        List<T> data = pageResult.getData();
        if (CollectionUtils.isEmpty(data)) {
            return new PageResult<>(pageResult.getTotal(), null);
        }
        return new PageResult<>(pageResult.getTotal(), toBean(data, clazz));
    }

    /**
     * 对集合bean转换
     * @param collection
     * @param clazz
     * @return
     * @param <T>
     */
    public static <T, R> List<R> toBean(Collection<T> collection, Class<R> clazz) {
        if (CollectionUtils.isEmpty(collection)) {
            return null;
        }
        return CollectionUtils.convert(collection, obj -> toBean(obj, clazz));
    }

    /**
     * 使用hutool进行bean转换
     * @param object
     * @param clazz
     * @return
     * @param <R>
     */
    public static <R> R toBean(Object object, Class<R> clazz) {
        return BeanUtil.toBean(object, clazz);
    }

    /**
     * 将一个object对象转指定类型的集合
     * @param data
     * @param clazz
     * @return
     * @param <R>
     */
    public static <R> List<R> toBeanList(Object data, Class<R> clazz) {
        if (ObjectUtil.isNull(data)) {
            return null;
        }
        List<Object> objects = new ArrayList<>((Collection<?>) data);
        return toBean(objects, clazz);
    }
}
